<?php

/**
 * Sgit_Util_Cache
 * 
 * @package local
 * @author juanma
 * @copyright 2012
 * @version $Id$
 * @access public
 * 
 * Esta clase nos permite crear una unica instancia en todo el tiempo de ejecucion para utiles 
 * 
 * 
 */
class Sgit_Cache
{

    protected static $singleton = NULL;
    
    protected $_model = NULL;
    protected $_clave = NULL;
    protected $_data = FALSE;
    

    public static function single()
    {
        
        // Si la clase no está instanciada la creamos.
        if(self::$singleton == NULL)
        {
            self::$singleton = new Sgit_Cache();
        }
        
        // Devolvemos la instancia de la clase
        return self::$singleton;
    }
    
    
    
    public function model($model)
    {
        $this->_model='Application_Model_'.$model;
        $this->_clave=md5($this->_model);
        
        if(!$this->_data[$this->_clave])
        {

            if (!class_exists($this->_model))
            {
                throw new Zend_Exception(sprintf('La clase %s no esta definida en %s',$this->_model,get_called_class()));
            }
            
            $dc=new $this->_model();
            
            if(!in_array($model,$this->_sin_zona))
            {
                $idZona= Zend_Controller_Front::getInstance()->getRequest()->getParam('idZona');           
                $this->_where['id_zona = ?']=$idZona;
            }

            //si hay cache tiramos de ella
            if($dc->getCacheActiva())
            {
                $this->_data[$this->_clave] = $dc->cacheAssoc(null,null,$this->_where);
            }else{
                $this->_data[$this->_clave] = $dc->getAssoc($dc->getPrimary(),null,$this->_where);
            }
        }
        
        return $this;
    }
    
    
    
    
    
    
    
    
    public function get($id,$key='nombre')
    {
      

            if(is_numeric($id))
            {
                if($key){
                    return $this->getKey($id,$key);
                }else{
                    return $this->getId($id);
                }
                
            }elseif(empty($id) || is_null($id)){
                return null;
            }else{
                 return $this->getAll();
            }

    }
    
    
    
    public function getId($id)
    {
        return $this->_data[$this->_clave][$id];
    }
    

    
    
    public function getKey($id,$key='nombre')
    {
        return $this->_data[$this->_clave][$id][$key];
    }
    
    public function getOne($col,$id)
    {
        return $this->_data[$this->_clave][$id][$col];
    }
    
    public function getRow($id)
    {
        return $this->_data[$this->_clave][$id];
    }
    
    public function getAll($where=null)
    {
        
       $array=$this->_data[$this->_clave];

       foreach($array as $v){
           print $v['id_zona'];
       }
           
    
       return $this->_data[$this->_clave];
    }
    
    public function getAssoc($key = 'id', $values = 'nombre')
    {

        foreach ((array )$this->_data[$this->_clave] as $v)
        {
           $k = $v[$key];
           
           if(is_array($values)){
               foreach($values as $valor){
                    $salida[$k][$valor] = $v[$valor];
               }
           }else{
               $salida[$k] = $v[$values];  
           }
           
           
        }

        return $salida;
    }
    
    

    
    
    // Sobreescribimos el método __clone para que produzca un error.
    public function __clone()
    {
        throw new Zend_Exception("No se puede clonar la clase Singleton.");
    }

}
